package io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 文件复制的优化
 */
public class CopyDemo2 {
    public static void main(String[] args) throws IOException {
        /*
         假设test.jpg图片数据：
        11001001 01110011 10101001 11100011 11101011 文件末尾
        byte[] data = new byte[3];//3个字节
        第一次调用： fis.read(data):一次读取3个字节
        11001001 01110011 10101001 11100011 11101011 文件末尾
        |--------读取的字节--------|

        test1.jpg的内容:
        11001001 01110011 10101001

        第二次调用： fis.read(data):一次读取3个字节
        11001001 01110011 10101001 11100011 11101011 文件末尾
                                  |--------读取的字节--------|
        data：{11100011 11101011 10101001}//将前两个数据替换了，最后的数据还是上次的
              |----读取的字节---| |-旧数据-|
        est1.jpg的内容:
        11001001 01110011 10101001 11100011 11101011 10101001

         */
        FileInputStream fis = new FileInputStream("test.jpg");
        FileOutputStream fos = new FileOutputStream("test2.jpg");
        /*
        InputStream超类中定义了块读取数据的方法：
        int read(byte[] data)
        一次性读取给定的字节数组data总长度的字节量，并存入到字节数组中
        返回值表示实际读取到了多少个字节，若返回-1表示读到了末尾

        OutputStream超类上也定义了块写字节的方法：
        void write(byte[] data)
        一次性将给定的字节数组data中的所有字节写出

        void write(byte[] data,int offset,int len)
        一次性将给定的字节数组data从下标offset处开始的连续len个字节
         */

        long start =System.currentTimeMillis();
        byte[]data = new byte[1024*10];//10kb
        int len;//记录每次实际读取的字节数
        while ((len=fis.read(data))!=-1){//每次读取10kb并判断是否读取到了末尾
            //将字节数组byte从下标0开始连续len个字节写出（做到读多少就写多少
            fos.write(data,0,len);
        }
        long end = System.currentTimeMillis();
        System.out.println("复制完毕,耗时："+(end-start)+"毫秒");//0毫秒，巨快
        fis.close();
        fos.close();
    }
}
